#ifndef ELECTRONICSCALEHORNDIAGRAM_H
#define ELECTRONICSCALEHORNDIAGRAM_H

#include "moduleelectronicscaledefine.h"

// 喇叭图
class ElectronicScaleHornDiagram
{
public:
    struct ViewingWindowError
    {
        int             window; // 观测窗 min，通常都是2/5/11/19/31min
        QList<double>   errors; // 误差百分比

        bool operator < (const ViewingWindowError &other) const
        {
            return (this->window < other.window);
        }

        bool operator == (const ViewingWindowError &other) const
        {
            return (this->window == other.window);
        }
    };
    struct ViewingWindowResult
    {
        int             window; // 观测窗
        double          errorMax; // 最大误差
        double          errorMin; // 最小误差
        double          errorTotal; // 总的平均百分比流量误差
    };

    enum ViewingWindow
    {
        ViewingWindow_2min = 2,
        ViewingWindow_5min = 5,
        ViewingWindow_11min = 11,
        ViewingWindow_19min = 19,
        ViewingWindow_31min = 31,

        _ViewingWindow_Max,
    };

    ElectronicScaleHornDiagram();
    ~ElectronicScaleHornDiagram();

    // 设置原始数据
    bool setSamples(const QList<electronicscale::Sample> &samples);

    // 计算观测窗百分比误差
    void calculateViewingWindowErrors(int viewingWindow);

    // 计算观测窗结果
    void calculateViewingWindowResult();

    // 获取观测窗结果
    QList<ViewingWindowResult> getViewingWindowResult() const;

    // 获取总的平均百分比流量误差
    double getTotalError() const;

    void setPeriod(int min);
    int getPeriod() const;
    void setInterval(int min);
    int getInterval() const;
    void setDensity(double value);
    double getDensity() const;
    void setTargetRate(double rate);
    double getTargetRate() const;

    // 导出喇叭图数据到excel
    static bool exportHornDiagramToXlsx(const QString &path, const QList<ViewingWindowResult> &results, const QString &sheetName = "Sheet1");

protected:
    // 从samples中提取采样间隔的数据，准备下一步处理
    // 如果返回false，即原始数据不符合接下来的数据处理要求
    bool extract();

    // 计算百分比误差
    void calculateErrors();

private:
    int     m_period = 60; // 分析周期 min,默认60min
    int     m_interval = 1; // 采样间隔 min,默认1min
//    int     m_viewingWindow; // 观测窗 min，通常都是2/5/11/19/31min
    double  m_density = 0.998; // 密度，水的密度0.998g/ml
    double  m_targetRate; // 目标流速 ml/h

    QList<electronicscale::Sample>  m_samples; // 原始数据
    QList<electronicscale::Sample>  m_standardSamples; // 标准数据，即经过提取的数据点，时间已按采样间隔对齐
    QList<double>                   m_errors; // 误差百分比，这是间隔时间的误差百分比
    double                          m_totalError; // 总的平均百分比流量误差
    QList<ViewingWindowError>       m_viewingWindowErrors; // 观测窗误差百分比
    QList<ViewingWindowResult>      m_viewingWindowResults; // 观测窗结果
};

#endif // ELECTRONICSCALEHORNDIAGRAM_H
